package com.hmdp.utils;

import com.aliyun.teaopenapi.models.Config;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import static com.aliyun.teautil.Common.toJSONString;

/**
 * 阿里云短信验证码发送工具类
 */
public class SMSUtils {

    /**
     * 发送短信（双参数模板）
     * <phoneNumbers>: 接收短信的手机号码，多个用英文逗号隔开
     * <signNameJson>: 短信签名名称，eg: "阿里云"
     * <templateCode>: 短信模板CODE
     * <templateParamJson>: 短信模板变量对应的实际值，eg：{"code":"1234"}
     *
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param code 验证码
     * @param time 验证码有效期（单位：秒）
     */
    public static void sendMessage(String signName, String templateCode, String phoneNumbers, String code, int time) {
        // 初始化请求客户端
        Client client = null;
        try {
            client = SMSUtils.createClient();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 构造请求对象，请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setTemplateParam("{\"code\":\"" + code + "\",\"time\":\"" + time + "\"}");

        // 获取响应对象
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = client.sendSms(sendSmsRequest);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
        //System.out.println(sendSmsResponse.getBody());
    }

    public static void main(String[] args) {
        sendMessage("个人网站应用签名", "SMS_474225170", "13847318526", "6666", 5);
    }

    private static Client createClient() throws Exception {
        Config config = new Config()
                // 配置 AccessKey ID，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 配置 AccessKey Secret，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));

        // 配置 Endpoint
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }

    /**
     * 发送短信（单参数模板）
     * <phoneNumbers>: 接收短信的手机号码，多个用英文逗号隔开
     * <signNameJson>: 短信签名名称，eg: "阿里云"
     * <templateCode>: 短信模板CODE
     * <templateParamJson>: 短信模板变量对应的实际值，eg：{"code":"1234"}
     *
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param code 验证码
     */
    public static void sendMessage(String signName, String templateCode, String phoneNumbers, String code) {
        // 初始化请求客户端
        Client client = null;
        try {
            client = SMSUtils.createClient();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 构造请求对象，请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setTemplateParam("{\"code\":\"" + code + "\"}");

        // 获取响应对象
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = client.sendSms(sendSmsRequest);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
    }
}